package com.proyecto.core.vista.echo.componentes;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;

import com.proyecto.core.Utilidades.UtilReflect;

import echopointng.BorderEx;
import echopointng.table.*;
import nextapp.echo2.app.table.DefaultTableModel;
import nextapp.echo2.app.table.TableCellRenderer;
import nextapp.echo2.app.*;
import nextapp.echo2.app.event.ActionEvent;
import nextapp.echo2.app.event.ActionListener;
import nextapp.echo2.app.list.DefaultListModel;
import nextapp.echo2.app.ApplicationInstance;
import nextapp.echo2.app.Column;
import nextapp.echo2.app.ResourceImageReference;
import nextapp.echo2.app.Row;
import nextapp.echo2.app.SelectField;
import nextapp.echo2.app.TextField;
import nextapp.echo2.app.Button;


public class RowTable extends Row {

	private static final long serialVersionUID = 934833726333365887L;
	private ResourceBundle resourceBundle;
	private List list;
	private SelectField cbCampo;
	private TextField txtText;
	private Button btnFiltrado;
	private Row rowFiltrado;
	private Row rowTabla;
	private DefaultListModel dlm = new DefaultListModel();
	private DefaultTableModel dtm;
	private DefaultPageableSortableTableModel pageableSortableTableModel;
	private SortableTableModel sortableTableModel ;
	private SortableTableSelectionModel sortableTableSelectionModel;
	private PageableSortableTable tabla ;
	private PageableTableNavigation tableScroller;
	private ArrayList<String> campos = new ArrayList<String>();
	private ArrayList<String> titulos = new ArrayList<String>();
	private Object pojo = null;
	private int directivaOrden = SortableTableModel.ASCENDING;
	private List<Object> resultadosFiltrados = new ArrayList<Object>();
	private List resultadosSinFiltro = null;
	private Component componenteTabla;
	private int columnaComponente=-1;
	private ActionListener ManejarEvento = new ActionListener(){
		private static final long serialVersionUID = -3158157527012608210L;
		public void actionPerformed(ActionEvent e) {
			pojo = list.get(obtenerIndice((PageableSortableTable) e.getSource()));
			if(((TableActionEventEx) e).getColumn()== columnaComponente){
				System.out.println("Sobre el boton...");
				((Button)componenteTabla).fireActionPerformed(e);
			}
		}
	};
	public Integer cantidadObjtos = 0;
	
	private ActionListener ManejarEventoCheckBox = new ActionListener(){
		//private static final long serialVersionUID = -3158157527012608210L;
		public void actionPerformed(ActionEvent e) {
			System.out.println("Check Box...");
		}
	};
	
	
	private ActionListener actionListenerBoton = new ActionListener(){
		public void actionPerformed(ActionEvent arg0) {
			System.err.println("Este evento debe ser seteado desde donde se usa...");
		}
	};
	
	public class Repintar implements TableCellRenderer { 	
		final int columnaInterna;
		public Repintar() {
			super();
			columnaInterna = columnaComponente;
        }

		public Component getTableCellRendererComponent(Table table, Object value, final int column, final int row) {
            
//AUTOR y CREADOR WILMER OZAL
//12:00 AM 28/02/2008  COPYRIGHT@	
        	Button button;
            TextField txt;
            CheckBox chk;
            //System.out.println("getTableCellRendererComponent.columnaInterna " + columnaInterna);
            //System.out.println("getTableCellRendererComponent.column " + column);
            //System.out.println("getTableCellRendererComponent.componenteTabla " + componenteTabla.getClass());
            
        	if(column > (columnaInterna - cantidadObjtos)){
        		
        		//Si quiero agregar un boton a la tabla
        		
        		if(componenteTabla instanceof Button){
        			System.out.println("componenteTabla" + componenteTabla.toString());
        			componenteTabla = new Button("Eliminar");
        			//((Button)componenteTabla).setIcon(new ResourceImageReference("/com/proyecto/vista/resource/imagenes/iconos/delete.png"));
        			((Button)componenteTabla).addActionListener(actionListenerBoton);
        		
        		//Si quiero agregar un textField a la tabla
        		}else if(componenteTabla instanceof TextField){
        			componenteTabla = new TextField();
        		}else if(componenteTabla instanceof CheckBox){
        			componenteTabla = new CheckBox();
        			((CheckBox)componenteTabla).addActionListener(ManejarEventoCheckBox);
        			if ("S".equalsIgnoreCase(((String )table.getModel().getValueAt(columnaInterna-1, row)))){
        				((CheckBox)componenteTabla).setSelected(true);	
        			}else{
       				   ((CheckBox)componenteTabla).setSelected(false);
       			    }
        		}
        		
        		return componenteTabla;
        		
        	}else{
                Label label = new Label(value.toString());
                return label;
            }
        	
        }
    }
	

	/**
	 * Construnctor que recibe como parametro un entero el cual se refiere a la forma en que
	 * se ordenara por defecto la tabla
	 * @author Carlos Yepez.
	 * @param ordenamiento
	 */
	public RowTable(int ordenamiento) {
		super();
		initComponents();
		this.inicializar(ordenamiento);
	}
	
	public void inicializar(int ordenamiento){
		cbCampo.setSelectedIndex(0);
		directivaOrden = ordenamiento;
	}
	
	public void verRowFiltrado(boolean ver){
		rowFiltrado.setVisible(ver);
	}
	/**
	 * @param ps PageableSortableTable
	 * @return Indice en el que se encuentra el pojo que es seleccionado
	 */
	public int obtenerIndice(PageableSortableTable ps){
		String p=ps.getSelectionModel().toString();
		p = p.replace("(in model space)", "");
		p = p.replace(",", "");
		p= p.trim();
		return (Integer.parseInt(p));
	}
	
	private void cargarFiltros() {
		dlm.add(resourceBundle.getString("CoreVista.componentes.rowpstabla.MostrarTodos"));
		for (int i = 0; i < titulos.size(); i++) {
			dlm.add(titulos.get(i));
		}
		cbCampo.setModel(dlm);
	}
	
	public void incluirCampo(String titulo,String atributo ,String ... atributoCampo) {
		campos.add(atributo);
		titulos.add(titulo);
		if(atributo.startsWith("*")){
			//System.err.println("campos.size()" + campos.size());
			columnaComponente = campos.size()-1;
			if(atributo.startsWith("*TextField")){
				if(atributoCampo.length>0){
					System.err.println("Just vico");
					System.err.println(atributoCampo[0]);
				}
			}
		}else{
			
		}
	}
	
	public PageableSortableTable generarTabla() {
		ColocarTitulos();
		tabla = new PageableSortableTable();
		tabla.setSelectionEnabled(true);
		SortableTableHeaderRenderer s = new SortableTableHeaderRenderer();
		sortableTableSelectionModel = new SortableTableSelectionModel(sortableTableModel);
		this.cargarFiltros();
		/***********************************************************/
        /*Permite configurar el color del encabezado de la tabla...*/
        /***********************************************************/
		
		s.setBackground(new Color(0xd0d0d0));//color de fondo.
        s.setBorder(new BorderEx(new Color(0xd0d0d0)));//color del borde.
        s.setInsets(new Insets(new Extent(0, Extent.PX),new Extent(0, Extent.PX), 
        			new Extent(0, Extent.PX), new Extent(0, Extent.PX)));//margen de los encabezados.
        tabla.setDefaultHeaderRenderer(s);//seteo el objeto a la tabla para que tenga el color del encabezado.
        tabla.setFont(new Font(new Font.Typeface("sans-serif"), Font.PLAIN,
				new Extent(8, Extent.PT)));
        
        rowTabla.add(tabla);
        
        tabla.setDefaultRenderer(new Repintar());
        
        tabla.addActionListener(ManejarEvento);
        
		return tabla;
	}
	
	public void ColocarTitulos(){
		dtm = new DefaultTableModel(this.getTitulos().size(),0);
		for (int k = 0; k < this.getTitulos().size(); k++) {
			dtm.setColumnName(k, this.getTitulos().get(k));
		}
	}
	
	
	public PageableSortableTable  cargarTabla(List l){
		pojo = null;
		tabla.removeAll();
		this.list = l;
		ArrayList<String[]> al = new ArrayList<String[]>();
		try {
			al = ProcesarLista(l);
		} catch (Exception e1) {
			e1.printStackTrace();
		}
		ColocarTitulos();
		
		dtm = LlenarTabla(titulos, al);
		pageableSortableTableModel = new DefaultPageableSortableTableModel(dtm);
		if (pageableSortableTableModel.getTotalRows() > 0){
			pageableSortableTableModel.setRowsPerPage(pageableSortableTableModel.getTotalRows());
		}
		
		AbleTableSelectionModel ableTableSelectionModel = new AbleTableSelectionModel(pageableSortableTableModel);
		ableTableSelectionModel.setSelectionMode(2);
        tabla.setModel(pageableSortableTableModel);
		tabla.setSelectionModel(ableTableSelectionModel);
        tabla.setSelectionEnabled(true);
        
//        tabla.addActionListener(ManejarEvento);
        tabla.setStyleName("OpenLabs.PageableSorTable.Default");
        tableScroller = new PageableTableNavigation(tabla);
        
        resultadosSinFiltro = copiarLista(l);
		resultadosFiltrados = copiarLista(l);
		this.cbCampo.setSelectedIndex(0);
		this.txtText.setText("");
		
        return tabla;
	}
	
	public ArrayList<String[]> ProcesarLista(List lista) throws  Exception{
		ArrayList<String[]> a = new ArrayList<String[]>();
		Object atributo;
		//Recorro cada elemento de la lista
		for (int i = 0; i < lista.size(); i++) {
			String[] cam =new String[campos.size()];
			//Recorro cada uno de los campos del pojo
			for(int j = 0; j< campos.size(); j++){
				if(campos.get(j).toString().equalsIgnoreCase("*")){
					cam[j] = "";
					componenteTabla = new Button();
				}else if(campos.get(j).toString().equalsIgnoreCase("*TextField")){
					cam[j] = "";
					componenteTabla = new TextField();
				}else if(campos.get(j).toString().equalsIgnoreCase("*CheckBox")){
					cam[j] = "";
					componenteTabla = new CheckBox();
					((CheckBox)componenteTabla).addActionListener(ManejarEventoCheckBox);
/*					try{
					   atributo= UtilReflect.invocarMetodoGet(lista.get(i), campos.get(j-1).toString(), null);
					}
					catch(Exception ee){
						atributo= "";
					}
					if (atributo != null){
    					if (  "S".equalsIgnoreCase( ((String)atributo).toString())){
	    					componenteTabla = new CheckBox();
			    		}else{
				    		componenteTabla = new CheckBox();
					    }
					}else{
						componenteTabla = new CheckBox();
					}
*/					//cam[j] = atributo==null?"":atributo.toString();
				}else{
					atributo= UtilReflect.invocarMetodoGet(lista.get(i), campos.get(j).toString(), null);
					//Meto en un arreglo los campos que corresponderan a cada fila de la tabla
					cam[j] = atributo==null?"":atributo.toString();
				}
				
			}
			//A�ado la fila al arreglo con que se crear� la tabla
			a.add(cam);
		}
		return a;
	}
	
	public DefaultTableModel LlenarTabla(ArrayList<String> titulos, ArrayList<String[]> lista) {
		for(int i = 0; i< lista.size();i++){
				dtm.addRow( lista.get(i));
		}
		return dtm;
	}
	
	public Object ManejaEvento(ActionEvent e) {
		pojo = list.get(obtenerIndice((PageableSortableTable) e.getSource()));
		return pojo;
	}
	
	public void mostrarPojoFiltrado(Object o){
		List<Object> lista = new ArrayList<Object>();
		lista.add(o);
		cargarTabla(lista);
	}
	
	private void filtrarAction(ActionEvent e) {
		/*Verifico que en el combo no este seleccionado un "mostrar todos"*/
		if (cbCampo.getSelectedIndex() >0) {
			String textPojo = "";
			/*Obtengo una copia de la lista de pojos que retorno el servicio*/
			resultadosFiltrados = copiarLista(list);
			/*
			 * Recorro el arreglo de pojos. La primera vez el tama�o sera el mismo que el que retorno el servicio
			 * Luego deberia ir disminuyendo seg�n la cantidad de veces que el usuario presione la tecla filtrar..
			 * */
			List<Object> resultadosFiltrados1 = new ArrayList<Object>();
			for (int i = 0; i < resultadosFiltrados.size(); i++) {
				try {
					/*Obtengo el atributo que quiero comparar de cada pojo*/
					textPojo = UtilReflect.invocarMetodoGet(list.get(i), campos.get(cbCampo.getSelectedIndex()-1).toString(), null).toString();
					/*Comparo cada atributo del pojo, con el texto que introdujo el usuario*/
					if (textPojo.toUpperCase().indexOf(txtText.getText().toUpperCase()) != -1) {
						/*Si el los atributos son coincidentes, meto en una lista dicho pojo*/
						resultadosFiltrados1.add(resultadosFiltrados.get(i));
					}
				} catch (Exception e1) {
					e1.printStackTrace();
				}
			}
			/*Cargo en la tabla los resultados filtrados*/
			this.cargarTabla(resultadosFiltrados1);
		}else{
			list.clear();
			this.cargarTabla(copiarLista(resultadosSinFiltro));
		}
		((SortableTableModel) (tabla.getModel())).sortByColumn(0, directivaOrden);
	}
	
	private List<Object> copiarLista(List l){
		List<Object> copia = new ArrayList<Object>();
		for(int i=0; i<l.size();i++){
			copia.add(l.get(i));
		}
		return copia;
	}
	
	public int encontrarPojoEnTabla(Object o){
		Object pojoId =null;
		int indice = -5;
		try {
			pojoId = UtilReflect.invocarMetodoGet(o, "id", null);
		} catch (Exception e) {
			e.printStackTrace(); 
		}
		for (int i=0; i<resultadosFiltrados.size();i++){
			try {
				if(pojoId.equals(UtilReflect.invocarMetodoGet(resultadosFiltrados.get(i), "id", null))){
					indice = i;
					break;
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		System.out.println("El indice es: "+indice);
		return indice;
	}

	public DefaultTableModel getDtm() {
		return dtm;
	}

	public void setDtm(DefaultTableModel dtm) {
		this.dtm = dtm;
	}

	public List getList() {
		return list;
	}

	public void setList(List list) {
		this.list = list;
	}

	public ArrayList<String> getTitulos() {
		return titulos;
	}

	public void setTitulos(ArrayList<String> titulos) {
		this.titulos = titulos;
	}

	public PageableSortableTable getTabla() {
		return tabla;
	}

	public void setTabla(PageableSortableTable tabla) {
		this.tabla = tabla;
	}

	public ActionListener getManejarEvento() {
		return ManejarEvento;
	}

	public void setManejarEvento(ActionListener manejarEvento) {
		ManejarEvento = manejarEvento;
	}

	public ActionListener getActionListenerBoton() {
		return actionListenerBoton;
	}

	public void setActionListenerBoton(ActionListener actionListenerBoton) {
		this.actionListenerBoton = actionListenerBoton;
	}

	public ActionListener getManejarEventoCheckBox() {
		return ManejarEventoCheckBox;
	}

	public void setManejarEventoCheckBox(ActionListener manejarEventoCheckBox) {
		ManejarEventoCheckBox = manejarEventoCheckBox;
	}

	/**
	 * Configures initial state of component.
	 * WARNING: AUTO-GENERATED METHOD.
	 * Contents will be overwritten.
	 */
	private void initComponents() {
		resourceBundle = ResourceBundle.getBundle(
				"com.proyecto.core.vista.echo.resource.localization.etiquetas",
				ApplicationInstance.getActive().getLocale());
		Column column1 = new Column();
		add(column1);
		rowFiltrado = new Row();
		rowFiltrado.setStyleName("2OpenLabs.Row.Datos");
		column1.add(rowFiltrado);
		cbCampo = new SelectField();
		cbCampo.setStyleName("2OpenLabs.SelectField.Default");
		rowFiltrado.add(cbCampo);
		txtText = new TextField();
		txtText.setStyleName("2OpenLabs.TextField.Campo");
		rowFiltrado.add(txtText);
		btnFiltrado = new Button();
		btnFiltrado.setText(resourceBundle
				.getString("CoreVista.componentes.rowpstabla.filtrar"));
		btnFiltrado.setStyleName("2OpenLabs.Button.Transaccion");
		btnFiltrado.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				filtrarAction(e);
			}
		});
		rowFiltrado.add(btnFiltrado);
		rowTabla = new Row();
		rowTabla.setStyleName("2OpenLabs.Row.Datos");
		column1.add(rowTabla);
	}

}
